// MayBe 函子
class MayBe {
    static of(value) {
        return new MayBe(value);
    }

    constructor(value) {
        this._value = value;
    }

    map(fn) {
        return this.isNothing() ? MayBe.of(null) : MayBe.of(fn(this._value));
    }

    isNothing() {
        return this._value === null || this._value === undefined;
    }
}

let r = MayBe.of('Hello World').map(x => x.toUpperCase());
console.log(r);

// let r = MayBe.of(null).map(x => x.toUpperCase());
// console.log(r);

// let r = MayBe.of("hello world")
//     .map(x => x.toUpperCase())
//     .map(x => null)
//     .map(x => x.split(" "));
// console.log(r);